home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / var / db / pkg / sys-libs / glibc-2.3.6-r3 / glibc-2.3.6-r3.ebuild < prev    next >
Text File  |  2006-05-08  |  43KB  |  1,378 lines

  1. # Copyright 1999-2006 Gentoo Foundation
  2. # Distributed under the terms of the GNU General Public License v2
  3. # $Header: /var/cvsroot/gentoo-x86/sys-libs/glibc/glibc-2.3.6-r3.ebuild,v 1.11 2006/04/25 15:45:09 gustavoz Exp $
  4.  
  5. # TODO:
  6. #  - fix warning from glibc build system:
  7. #      /var/tmp/portage/glibc-2.3.6-r2/work/build-x86-x86_64-pc-linux-gnu-nptl/elf/ldconfig: Can't open configuration file /etc/ld.so.conf: No such file or directory
  8. #  - fix warning from ebuild (amd64 multilib):
  9. #      mv: cannot stat `/var/tmp/portage/glibc-2.3.6-r2/image//usr/lib32/locale': No such file or directory
  10. #  - glibc installs a bunch of lib64 stuff into /usr/lib:
  11. #      qlist glibc | grep ^/usr/lib/ | grep -v /debug/
  12.  
  13. # Here's how the cross-compile logic breaks down ...
  14. #  CTARGET - machine that will target the binaries
  15. #  CHOST   - machine that will host the binaries
  16. #  CBUILD  - machine that will build the binaries
  17. # If CTARGET != CHOST, it means you want a libc for cross-compiling.
  18. # If CHOST != CBUILD, it means you want to cross-compile the libc.
  19. #  CBUILD = CHOST = CTARGET    - native build/install
  20. #  CBUILD != (CHOST = CTARGET) - cross-compile a native build
  21. #  (CBUILD = CHOST) != CTARGET - libc for cross-compiler
  22. #  CBUILD != CHOST != CTARGET  - cross-compile a libc for a cross-compiler
  23. # For install paths:
  24. #  CHOST = CTARGET  - install into /
  25. #  CHOST != CTARGET - install into /usr/CTARGET/
  26.  
  27. #KEYWORDS="~amd64 ~arm -hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86"
  28. KEYWORDS="-* ~alpha ~amd64 ~arm ~ia64 ~mips ~ppc ~ppc64 ~s390 sparc x86"
  29.  
  30. BRANCH_UPDATE=""
  31.  
  32. # From linuxthreads/man
  33. GLIBC_MANPAGE_VERSION="2.3.6-1"
  34.  
  35. # From manual
  36. GLIBC_INFOPAGE_VERSION="2.3.6"
  37.  
  38. # Gentoo patchset
  39. PATCH_VER="1.8"
  40.  
  41. # C Stubbs addon (contained in fedora, so ignoring)
  42. #CSTUBS_VER="2.1.2"
  43. #CSTUBS_TARBALL="c_stubs-${CSTUBS_VER}.tar.bz2"
  44. #CSTUBS_URI="mirror://gentoo/${CSTUBS_TARBALL}"
  45.  
  46. # Fedora addons (from RHEL's glibc-2.3.4-2.src.rpm)
  47. FEDORA_VER="20041219T2331"
  48. FEDORA_TARBALL="glibc-fedora-${FEDORA_VER}.tar.bz2"
  49. FEDORA_URI="mirror://gentoo/${FEDORA_TARBALL}"
  50.  
  51. GENTOO_TOOLCHAIN_BASE_URI="mirror://gentoo"
  52. GENTOO_TOOLCHAIN_DEV_URI="http://dev.gentoo.org/~azarah/glibc"
  53.  
  54. ### PUNT OUT TO ECLASS?? ###
  55. inherit eutils versionator libtool toolchain-funcs flag-o-matic gnuconfig multilib
  56.  
  57. DESCRIPTION="GNU libc6 (also called glibc2) C library"
  58. HOMEPAGE="http://www.gnu.org/software/libc/libc.html"
  59. LICENSE="LGPL-2"
  60.  
  61. IUSE="nls pic build nptl nptlonly erandom hardened userlocales multilib selinux glibc-compat20 glibc-omitfp linuxthreads-tls profile"
  62.  
  63. export CBUILD=${CBUILD:-${CHOST}}
  64. export CTARGET=${CTARGET:-${CHOST}}
  65. if [[ ${CTARGET} == ${CHOST} ]] ; then
  66.     if [[ ${CATEGORY/cross-} != ${CATEGORY} ]] ; then
  67.         export CTARGET=${CATEGORY/cross-}
  68.     fi
  69. fi
  70. if [[ ${CTARGET} == ${CHOST} ]] ; then
  71.     PROVIDE="virtual/libc"
  72. fi
  73.  
  74. is_crosscompile() {
  75.     [[ ${CHOST} != ${CTARGET} ]]
  76. }
  77. just_headers() {
  78.     is_crosscompile && has _E_CROSS_HEADERS_ONLY ${USE}
  79. }
  80.  
  81. GLIBC_RELEASE_VER=$(get_version_component_range 1-3)
  82.  
  83. # Don't set this to :-, - allows BRANCH_UPDATE=""
  84. BRANCH_UPDATE=${BRANCH_UPDATE-$(get_version_component_range 4)}
  85.  
  86. # (Recent snapshots fails with 2.6.5 and earlier with NPTL)
  87. NPTL_KERNEL_VERSION=${NPTL_KERNEL_VERSION:-"2.6.9"}
  88. LT_KERNEL_VERSION=${LT_KERNEL_VERSION:-"2.4.1"}
  89.  
  90. ### SRC_URI ###
  91.  
  92. # This function handles the basics of setting the SRC_URI for a glibc ebuild.
  93. # To use, set SRC_URI with:
  94. #
  95. #    SRC_URI="$(get_glibc_src_uri)"
  96. #
  97. # Other than the variables normally set by portage, this function's behavior
  98. # can be altered by setting the following:
  99. #
  100. #    GENTOO_TOOLCHAIN_BASE_URI
  101. #            This sets the base URI for all gentoo-specific patch files. Note
  102. #            that this variable is only important for a brief period of time,
  103. #            before your source files get picked up by mirrors. However, it is
  104. #            still highly suggested that you keep files in this location
  105. #            available.
  106. #
  107. #    BRANCH_UPDATE
  108. #            If set, this variable signals that we should be using the main
  109. #            release tarball (determined by ebuild version) and applying a
  110. #            CVS branch update patch against it. The location of this branch
  111. #            update patch is assumed to be in ${GENTOO_TOOLCHAIN_BASE_URI}.
  112. #            Just like with SNAPSHOT, this variable is ignored if the ebuild
  113. #            has a _pre suffix.
  114. #
  115. #    PATCH_VER
  116. #    PATCH_GLIBC_VER
  117. #            This should be set to the version of the gentoo patch tarball.
  118. #            The resulting filename of this tarball will be:
  119. #            glibc-${PATCH_GLIBC_VER:-${GLIBC_RELEASE_VER}}-patches-${PATCH_VER}.tar.bz2
  120. #
  121. #    GLIBC_MANPAGE_VERSION
  122. #    GLIBC_INFOPAGE_VERSION
  123. #            The version of glibc for which we will download pages. This will
  124. #            default to ${GLIBC_RELEASE_VER}, but we may not want to pre-generate man pages
  125. #            for prerelease test ebuilds for example. This allows you to
  126. #            continue using pre-generated manpages from the last stable release.
  127. #            If set to "none", this will prevent the downloading of manpages,
  128. #            which is useful for individual library targets.
  129. #
  130. get_glibc_src_uri() {
  131.     GENTOO_TOOLCHAIN_BASE_URI=${GENTOO_TOOLCHAIN_BASE_URI:-"mirror://gentoo"}
  132.  
  133. #    GLIBC_SRC_URI="http://ftp.gnu.org/gnu/glibc/glibc-${GLIBC_RELEASE_VER}.tar.bz2
  134. #                   http://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-${GLIBC_RELEASE_VER}.tar.bz2
  135. #                   http://ftp.gnu.org/gnu/glibc/glibc-libidn-${GLIBC_RELEASE_VER}.tar.bz2
  136.     GLIBC_SRC_URI="mirror://gnu/glibc/glibc-${GLIBC_RELEASE_VER}.tar.bz2
  137.                    mirror://gnu/glibc/glibc-linuxthreads-${GLIBC_RELEASE_VER}.tar.bz2
  138.                    mirror://gnu/glibc/glibc-libidn-${GLIBC_RELEASE_VER}.tar.bz2"
  139.  
  140.     if [[ -n ${BRANCH_UPDATE} ]] ; then
  141.         GLIBC_SRC_URI="${GLIBC_SRC_URI}
  142.             ${GENTOO_TOOLCHAIN_BASE_URI}/glibc-${GLIBC_RELEASE_VER}-branch-update-${BRANCH_UPDATE}.patch.bz2"
  143.         [[ -n ${GENTOO_TOOLCHAIN_DEV_URI} ]] &&
  144.             GLIBC_SRC_URI="${GLIBC_SRC_URI}
  145.                 ${GENTOO_TOOLCHAIN_DEV_URI}/glibc-${GLIBC_RELEASE_VER}-branch-update-${BRANCH_UPDATE}.patch.bz2"
  146.     fi
  147.  
  148.     if [[ -n ${PATCH_VER} ]] ; then
  149.         GLIBC_SRC_URI="${GLIBC_SRC_URI}
  150.             ${GENTOO_TOOLCHAIN_BASE_URI}/glibc-${PATCH_GLIBC_VER:-${GLIBC_RELEASE_VER}}-patches-${PATCH_VER}.tar.bz2"
  151.         [[ -n ${GENTOO_TOOLCHAIN_DEV_URI} ]] &&
  152.             GLIBC_SRC_URI="${GLIBC_SRC_URI}
  153.                 ${GENTOO_TOOLCHAIN_DEV_URI}/glibc-${PATCH_GLIBC_VER:-${GLIBC_RELEASE_VER}}-patches-${PATCH_VER}.tar.bz2"
  154.     fi
  155.  
  156.     if [[ ${GLIBC_MANPAGE_VERSION} != "none" ]] ; then
  157.         GLIBC_SRC_URI="${GLIBC_SRC_URI}
  158.             ${GENTOO_TOOLCHAIN_BASE_URI}/glibc-manpages-${GLIBC_MANPAGE_VERSION:-${GLIBC_RELEASE_VER}}.tar.bz2"
  159.         [[ -n ${GENTOO_TOOLCHAIN_DEV_URI} ]] &&
  160.             GLIBC_SRC_URI="${GLIBC_SRC_URI}
  161.                 ${GENTOO_TOOLCHAIN_DEV_URI}/glibc-manpages-${GLIBC_MANPAGE_VERSION:-${GLIBC_RELEASE_VER}}.tar.bz2"
  162.     fi
  163.  
  164.     if [[ ${GLIBC_INFOPAGE_VERSION} != "none" ]] ; then
  165.         GLIBC_SRC_URI="${GLIBC_SRC_URI}
  166.             ${GENTOO_TOOLCHAIN_BASE_URI}/glibc-infopages-${GLIBC_INFOPAGE_VERSION:-${GLIBC_RELEASE_VER}}.tar.bz2"
  167.         [[ -n ${GENTOO_TOOLCHAIN_DEV_URI} ]] &&
  168.             GLIBC_SRC_URI="${GLIBC_SRC_URI}
  169.                 ${GENTOO_TOOLCHAIN_DEV_URI}/glibc-infopages-${GLIBC_INFOPAGE_VERSION:-${GLIBC_RELEASE_VER}}.tar.bz2"
  170.     fi
  171.  
  172.     if [[ -n ${CSTUBS_URI} ]] ; then
  173.         GLIBC_SRC_URI="${GLIBC_SRC_URI} ${CSTUBS_URI}"
  174.     fi
  175.  
  176.     if [[ -n ${FEDORA_URI} ]] ; then
  177.         GLIBC_SRC_URI="${GLIBC_SRC_URI} ${FEDORA_URI}"
  178.     fi
  179.  
  180.     echo "${GLIBC_SRC_URI}"
  181. }
  182.  
  183. SRC_URI=$(get_glibc_src_uri)
  184. S=${WORKDIR}/glibc-${GLIBC_RELEASE_VER}
  185.  
  186. ### EXPORTED FUNCTIONS ###
  187. toolchain-glibc_src_unpack() {
  188.     # Check NPTL support _before_ we unpack things to save some time
  189.     want_nptl && check_nptl_support
  190.  
  191.     unpack glibc-${GLIBC_RELEASE_VER}.tar.bz2
  192.  
  193.     cd "${S}"
  194.     unpack glibc-linuxthreads-${GLIBC_RELEASE_VER}.tar.bz2
  195.     unpack glibc-libidn-${GLIBC_RELEASE_VER}.tar.bz2
  196.  
  197.     [[ -n ${CSTUBS_TARBALL} ]] && unpack ${CSTUBS_TARBALL}
  198.     [[ -n ${FEDORA_TARBALL} ]] && unpack ${FEDORA_TARBALL}
  199.  
  200.     if [[ -n ${PATCH_VER} ]] ; then
  201.         cd "${WORKDIR}"
  202.         unpack glibc-${PATCH_GLIBC_VER:-${GLIBC_RELEASE_VER}}-patches-${PATCH_VER}.tar.bz2
  203.     fi
  204.  
  205.     # XXX: We should do the branchupdate, before extracting the manpages and
  206.     # infopages else it does not help much (mtimes change if there is a change
  207.     # to them with branchupdate)
  208.     if [[ -n ${BRANCH_UPDATE} ]] ; then
  209.         cd "${S}"
  210.         epatch "${DISTDIR}"/glibc-${GLIBC_RELEASE_VER}-branch-update-${BRANCH_UPDATE}.patch.bz2
  211.  
  212.         # Snapshot date patch
  213.         einfo "Patching version to display snapshot date ..."
  214.         sed -i -e "s:\(#define RELEASE\).*:\1 \"${BRANCH_UPDATE}\":" version.h
  215.     fi
  216.  
  217.     if [[ ${GLIBC_MANPAGE_VERSION} != "none" ]] ; then
  218.         cd "${WORKDIR}"
  219.         unpack glibc-manpages-${GLIBC_MANPAGE_VERSION:-${GLIBC_RELEASE_VER}}.tar.bz2
  220.     fi
  221.  
  222.     if [[ ${GLIBC_INFOPAGE_VERSION} != "none" ]] ; then
  223.         cd "${S}"
  224.         unpack glibc-infopages-${GLIBC_INFOPAGE_VERSION:-${GLIBC_RELEASE_VER}}.tar.bz2
  225.     fi
  226.  
  227.     if [[ -n ${PATCH_VER} ]] ; then
  228.         cd "${S}"
  229.         EPATCH_MULTI_MSG="Applying Gentoo Glibc Patchset ${PATCH_GLIBC_VER:-${GLIBC_RELEASE_VER}}-${PATCH_VER} ..." \
  230.         EPATCH_EXCLUDE=${GLIBC_PATCH_EXCLUDE} \
  231.         EPATCH_SUFFIX="patch" \
  232.         ARCH=$(tc-arch) \
  233.         epatch "${WORKDIR}"/patches
  234.     fi
  235. }
  236.  
  237. toolchain-glibc_src_compile() {
  238.     # Set gconvdir to /usr/$(get_libdir)/gconv on archs with multiple ABIs
  239.     local MAKEFLAGS=""
  240.     has_multilib_profile && MAKEFLAGS="gconvdir=$(alt_usrlibdir)/gconv"
  241.  
  242.     echo
  243.     for v in ABI CBUILD CHOST CTARGET CBUILD_OPT CTARGET_OPT CC CFLAGS ; do
  244.         einfo " $(printf '%15s' ${v}:)   ${!v}"
  245.     done
  246.     echo
  247.  
  248.     if want_linuxthreads ; then
  249.         glibc_do_configure linuxthreads
  250.         einfo "Building GLIBC with linuxthreads..."
  251.         make PARALLELMFLAGS="${MAKEOPTS}" ${MAKEFLAGS} || die "make for ${ABI} failed"
  252.     fi
  253.     if want_nptl ; then
  254.         # ... and then do the optional nptl build
  255.         unset LD_ASSUME_KERNEL
  256.         glibc_do_configure nptl
  257.         einfo "Building GLIBC with NPTL..."
  258.         make PARALLELMFLAGS="${MAKEOPTS}" ${MAKEFLAGS} || die "make for ${ABI} failed"
  259.     fi
  260. }
  261.  
  262. toolchain-glibc_headers_compile() {
  263.     GBUILDDIR=${WORKDIR}/build-${ABI}-${CTARGET}-headers
  264.     mkdir -p "${GBUILDDIR}"
  265.     cd "${GBUILDDIR}"
  266.  
  267.     # Pick out the correct location for build headers
  268.     local myconf="--disable-sanity-checks --enable-hacker-mode"
  269.     myconf="${myconf}
  270.         --enable-add-ons=linuxthreads
  271.         --without-cvs
  272.         --enable-bind-now
  273.         --build=${CBUILD_OPT:-${CBUILD}}
  274.         --host=${CTARGET_OPT:-${CTARGET}}
  275.         --with-headers=$(alt_build_headers)
  276.         --prefix=$(alt_prefix)
  277.         --mandir=$(alt_prefix)/share/man
  278.         --infodir=$(alt_prefix)/share/info
  279.         --libexecdir=$(alt_prefix)/lib/misc/glibc
  280.         ${EXTRA_ECONF}"
  281.  
  282.     einfo "Configuring GLIBC headers with: ${myconf// /\n\t\t}"
  283.     CC=gcc \
  284.     CFLAGS="-O1 -pipe" \
  285.     ${S}/configure ${myconf} || die "failed to configure glibc"
  286. }
  287.  
  288. toolchain-glibc_src_test() {
  289.     # This is wrong, but glibc's tests fail bad when screwing
  290.     # around with sandbox, so lets just punt it
  291.     unset LD_PRELOAD
  292.  
  293.     # do the linuxthreads build unless we're using nptlonly
  294.     if want_linuxthreads ; then
  295.         cd "${WORKDIR}"/build-${ABI}-${CTARGET}-linuxthreads
  296.         einfo "Checking GLIBC with linuxthreads..."
  297.         make check || die "linuxthreads glibc did not pass make check"
  298.     fi
  299.     if want_nptl ; then
  300.         cd "${WORKDIR}"/build-${ABI}-${CTARGET}-nptl
  301.         unset LD_ASSUME_KERNEL || :
  302.         einfo "Checking GLIBC with NPTL..."
  303.         make check || die "nptl glibc did not pass make check"
  304.     fi
  305. }
  306.  
  307. toolchain-glibc_pkg_preinst() {
  308.     # PPC64+others may want to eventually be added to this logic if they
  309.     # decide to be multilib compatible and FHS compliant. note that this
  310.     # chunk of FHS compliance only applies to 64bit archs where 32bit
  311.     # compatibility is a major concern (not IA64, for example).
  312.  
  313.     # amd64's 2005.0 is the first amd64 profile to not need this code.
  314.     # 2005.0 is setup properly, and this is executed as part of the
  315.     # 2004.3 -> 2005.0 upgrade script.
  316.     # It can be removed after 2004.3 has been purged from portage.
  317.     { use amd64 || use ppc64; } && [ "$(get_libdir)" == "lib64" ] && ! has_multilib_profile && fix_lib64_symlinks
  318.  
  319.     # it appears that /lib/tls is sometimes not removed. See bug
  320.     # 69258 for more info.
  321.     if [[ -d ${ROOT}/$(alt_libdir)/tls ]] && ! { want_nptl && want_linuxthreads; }; then
  322.         addwrite "${ROOT}"/$(alt_libdir)/
  323.         ewarn "nptlonly or -nptl in USE, removing /${ROOT}$(alt_libdir)/tls..."
  324.         rm -r "${ROOT}"/$(alt_libdir)/tls || die
  325.     fi
  326.  
  327.     # Shouldnt need to keep this updated
  328.     [[ -e ${ROOT}/etc/locales.build ]] && rm -f "${D}"/etc/locales.build
  329. }
  330.  
  331. toolchain-glibc_src_install() {
  332.     # Need to dodir first because it might not exist (bad amd64 profiles)
  333.     dodir $(alt_usrlibdir)
  334.  
  335.     # These should not be set, else the
  336.     # zoneinfo do not always get installed ...
  337.     unset LANGUAGE LANG LC_ALL
  338.  
  339.     if want_linuxthreads ; then
  340.         cd "${WORKDIR}"/build-${ABI}-${CTARGET}-linuxthreads
  341.         einfo "Installing GLIBC ${ABI} with linuxthreads ..."
  342.         make PARALLELMFLAGS="${MAKEOPTS} -j1" \
  343.             install_root="${D}" \
  344.             install || die
  345.     else # nptlonly
  346.         cd "${WORKDIR}"/build-${ABI}-${CTARGET}-nptl
  347.         einfo "Installing GLIBC ${ABI} with NPTL ..."
  348.         make PARALLELMFLAGS="${MAKEOPTS} -j1" \
  349.             install_root="${D}" \
  350.             install || die
  351.     fi
  352.  
  353.     if is_crosscompile ; then
  354.         # punt all the junk not needed by a cross-compiler
  355.         rm -rf "${D}"$(alt_prefix)/{bin,etc,$(get_libdir)/{gconv,misc},sbin,share}
  356.     else
  357.         # zoneinfo stuff is now provided by the timezone-data package
  358.         rm -rf "${D}"/usr/share/zoneinfo
  359.         rm -f "${D}"/usr/bin/tzselect
  360.         rm -f "${D}"/usr/sbin/{zic,zdump}
  361.     fi
  362.  
  363.     if want_linuxthreads && want_nptl ; then
  364.         einfo "Installing NPTL to $(alt_libdir)/tls/..."
  365.         cd "${WORKDIR}"/build-${ABI}-${CTARGET}-nptl
  366.         mkdir -p "${D}"$(alt_libdir)/tls/
  367.  
  368.         libcsofile=$(basename "${D}"$(alt_libdir)/libc-*.so)
  369.         cp -a libc.so "${D}"$(alt_libdir)/tls/${libcsofile} || die
  370.         dosym ${libcsofile} $(alt_libdir)/tls/$(ls libc.so.*)
  371.  
  372.         libmsofile=$(basename "${D}"$(alt_libdir)/libm-*.so)
  373.         pushd math > /dev/null
  374.         cp -a libm.so "${D}"$(alt_libdir)/tls/${libmsofile} || die
  375.         dosym ${libmsofile} $(alt_libdir)/tls/$(ls libm.so.*)
  376.         popd > /dev/null
  377.  
  378.         librtsofile=$(basename "${D}"$(alt_libdir)/librt-*.so)
  379.         pushd rt > /dev/null
  380.         cp -a librt.so "${D}"$(alt_libdir)/tls/${librtsofile} || die
  381.         dosym ${librtsofile} $(alt_libdir)/tls/$(ls librt.so.*)
  382.         popd > /dev/null
  383.  
  384.         libthreaddbsofile=$(basename "${D}"$(alt_libdir)/libthread_db-*.so)
  385.         pushd nptl_db > /dev/null
  386.         cp -a libthread_db.so "${D}"$(alt_libdir)/tls/${libthreaddbsofile} || die
  387.         dosym ${libthreaddbsofile} $(alt_libdir)/tls/$(ls libthread_db.so.*)
  388.         popd > /dev/null
  389.  
  390.         libpthreadsofile=libpthread-${GLIBC_RELEASE_VER}.so
  391.         cp -a nptl/libpthread.so "${D}"$(alt_libdir)/tls/${libpthreadsofile} || die
  392.         dosym ${libpthreadsofile} $(alt_libdir)/tls/libpthread.so.0
  393.  
  394.         # and now for the static libs
  395.         mkdir -p "${D}"$(alt_usrlibdir)/nptl
  396.         cp -a libc.a nptl/libpthread.a nptl/libpthread_nonshared.a rt/librt.a \
  397.             "${D}"$(alt_usrlibdir)/nptl
  398.  
  399.         # linker script crap
  400.         for lib in libc libpthread; do
  401.             sed -e "s:$(alt_libdir)/${lib}.so:$(alt_libdir)/tls/${lib}.so:g" \
  402.                 -e "s:$(alt_usrlibdir)/${lib}_nonshared.a:$(alt_usrlibdir)/nptl/${lib}_nonshared.a:g" \
  403.                       "${D}"$(alt_usrlibdir)/${lib}.so \
  404.                 > "${D}"$(alt_usrlibdir)/nptl/${lib}.so
  405.  
  406.             chmod 755 "${D}"$(alt_usrlibdir)/nptl/${lib}.so
  407.         done
  408.  
  409.         dosym ../librt.so $(alt_usrlibdir)/nptl/librt.so
  410.  
  411.         # last but not least... headers.
  412.         mkdir -p "${D}"/nptl "${D}"$(alt_headers)/nptl
  413.         make install_root="${D}"/nptl install-headers PARALLELMFLAGS="${MAKEOPTS} -j1"
  414.         pushd "${D}"/nptl/$(alt_headers) > /dev/null
  415.         for i in $(find . -type f) ; do
  416.             if ! [[ -f ${D}$(alt_headers)/$i ]] \
  417.                || ! cmp -s $i ${D}$(alt_headers)/$i; then
  418.                 mkdir -p ${D}$(alt_headers)/nptl/`dirname $i`
  419.                 cp -a $i ${D}$(alt_headers)/nptl/$i
  420.             fi
  421.         done
  422.         popd > /dev/null
  423.         rm -rf ${D}/nptl
  424.     fi
  425.  
  426.     if use pic && [[ $(tc-arch) != "amd64" ]] ; then
  427.         find ${S}/${buildtarget}/ -name "soinit.os" -exec cp {} ${D}$(alt_libdir)/soinit.o \;
  428.         find ${S}/${buildtarget}/ -name "sofini.os" -exec cp {} ${D}$(alt_libdir)/sofini.o \;
  429.         find ${S}/${buildtarget}/ -name "*_pic.a" -exec cp {} ${D}$(alt_libdir) \;
  430.         find ${S}/${buildtarget}/ -name "*.map" -exec cp {} ${D}$(alt_libdir) \;
  431.  
  432.         for i in ${D}$(alt_libdir)/*.map; do
  433.             mv ${i} ${i%.map}_pic.map
  434.         done
  435.     fi
  436.  
  437.     # We'll take care of the cache ourselves
  438.     rm -f ${D}/etc/ld.so.cache
  439.  
  440.     # Some things want this, notably ash.
  441.     dosym libbsd-compat.a $(alt_usrlibdir)/libbsd.a
  442.  
  443.     # Handle includes for different ABIs
  444.     prep_ml_includes $(alt_headers)
  445.  
  446.     #################################################################
  447.     # EVERYTHING AFTER THIS POINT IS FOR NATIVE GLIBC INSTALLS ONLY #
  448.     # Make sure we install the sys-include symlink so that when 
  449.     # we build a 2nd stage cross-compiler, gcc finds the target 
  450.     # system headers correctly.  See gcc/doc/gccinstall.info
  451.     if is_crosscompile ; then
  452.         dosym include $(alt_prefix)/sys-include
  453.         dosym . $(alt_prefix)/usr
  454.         return 0
  455.     fi
  456.  
  457.     # Everything past this point just needs to be done once... don't waste time building locale files twice...
  458.     is_final_abi || return 0
  459.  
  460.     if want_linuxthreads ; then
  461.         MYMAINBUILDDIR=build-${ABI}-${CTARGET}-linuxthreads
  462.     else
  463.         MYMAINBUILDDIR=build-${ABI}-${CTARGET}-nptl
  464.     fi
  465.     cd "${WORKDIR}"/${MYMAINBUILDDIR}
  466.     if ! use build ; then
  467.         if ! has noinfo ${FEATURES} && [[ ${GLIBC_INFOPAGE_VERSION} != "none" ]] ; then
  468.             einfo "Installing info pages..."
  469.  
  470.             make PARALLELMFLAGS="${MAKEOPTS} -j1" \
  471.                 install_root=${D} \
  472.                 info -i
  473.         fi
  474.  
  475.         setup_locales
  476.  
  477.         if [[ ${GLIBC_MANPAGE_VERSION} != "none" ]] ; then
  478.             einfo "Installing man pages..."
  479.  
  480.             # Install linuxthreads man pages even if nptl is enabled
  481.             cd "${WORKDIR}"/man
  482.             doman *.3thr
  483.         fi
  484.  
  485.         # Install nscd config file
  486.         insinto /etc
  487.         doins ${FILESDIR}/nscd.conf
  488.         doins "${FILESDIR}"/nsswitch.conf
  489.  
  490.         doinitd "${FILESDIR}"/nscd
  491.  
  492.         cd ${S}
  493.         dodoc BUGS ChangeLog* CONFORMANCE FAQ INTERFACE NEWS NOTES PROJECTS README*
  494.     else
  495.         rm -rf ${D}/usr/share
  496.         for dir in $(get_all_libdirs); do
  497.             rm -rf ${D}/usr/${dir}/gconv &> /dev/null
  498.         done
  499.     fi
  500.  
  501.     # Is this next line actually needed or does the makefile get it right?
  502.     # It previously has 0755 perms which was killing things.
  503.     fperms 4711 $(alt_prefix)/lib/misc/glibc/pt_chown
  504.  
  505.     # Prevent overwriting of the /etc/localtime symlink.  We'll handle the
  506.     # creation of the "factory" symlink in pkg_postinst().
  507.     rm -f ${D}/etc/localtime
  508.  
  509.     insinto /etc
  510.     # This is our new config file for building locales
  511.     doins ${FILESDIR}/locales.build
  512.     # example host.conf with multicast dns disabled by default
  513.     doins ${FILESDIR}/2.3.6/host.conf
  514.  
  515.     # simple test to make sure our new glibc isnt completely broken.
  516.     # for now, skip the multilib scenario.  also make sure we don't
  517.     # test with statically built binaries since they will fail.
  518.     [[ ${CBUILD} != ${CHOST} ]] && return 0
  519.     [[ $(get_libdir) != "lib" ]] && return 0
  520.     for x in date env ls true uname ; do
  521.         x=$(type -p ${x})
  522.         [[ -z ${x} ]] && continue
  523.         striptest=$(file -L ${x} 2>/dev/null)
  524.         [[ -z ${striptest} ]] && continue
  525.         [[ ${striptest/statically linked} != "${striptest}" ]] && continue
  526.         "${D}"/$(get_libdir)/ld-*.so \
  527.             --library-path "${D}"/$(get_libdir) \
  528.             ${x} > /dev/null \
  529.             || die "simple run test (${x}) failed"
  530.     done
  531. }
  532.  
  533. toolchain-glibc_headers_install() {
  534.     GBUILDDIR=${WORKDIR}/build-${ABI}-${CTARGET}-headers
  535.     cd "${GBUILDDIR}"
  536.     make install_root="${D}" install-headers || die "install-headers failed"
  537.     # Copy over headers that are not part of install-headers ... these
  538.     # are pretty much taken verbatim from crosstool, see it for more details
  539.     insinto $(alt_headers)/bits
  540.     doins misc/syscall-list.h bits/stdio_lim.h || die "doins include bits"
  541.     insinto $(alt_headers)/gnu
  542.     doins "${S}"/include/gnu/stubs.h || die "doins include gnu"
  543.     # Make sure we install the sys-include symlink so that when 
  544.     # we build a 2nd stage cross-compiler, gcc finds the target 
  545.     # system headers correctly.  See gcc/doc/gccinstall.info
  546.     dosym include $(alt_prefix)/sys-include
  547.     dosym . $(alt_prefix)/usr
  548. }
  549.  
  550. toolchain-glibc_pkg_postinst() {
  551.     # Mixing nptlonly and -nptlonly glibc can prove dangerous if libpthread
  552.     # isn't removed in unmerge which happens sometimes.  See bug #87671
  553.     if ! is_crosscompile && want_linuxthreads ; then
  554.         for libdir in $(get_all_libdirs) ; do
  555.             for f in ${ROOT}/${libdir}/libpthread-2.* ${ROOT}/${libdir}/libpthread-0.6* ; do
  556.                 if [[ -f ${f} ]] ; then
  557.                     rm -f ${f}
  558.                     ldconfig
  559.                 fi
  560.             done
  561.         done
  562.     fi
  563.  
  564.     if ! is_crosscompile && [ -x "${ROOT}/usr/sbin/iconvconfig" ] ; then
  565.         # Generate fastloading iconv module configuration file.
  566.         ${ROOT}/usr/sbin/iconvconfig --prefix=${ROOT}
  567.     fi
  568.  
  569.     if [ ! -e "${ROOT}/lib/ld.so.1" ] && use ppc64 && ! has_multilib_profile ; then
  570.         ## SHOULDN'T THIS BE lib64??
  571.         ln -s ld64.so.1 ${ROOT}/lib/ld.so.1
  572.     fi
  573.  
  574.     # Reload init ...
  575.     if ! is_crosscompile && [ "${ROOT}" = "/" ] ; then
  576.         /sbin/init U &> /dev/null
  577.     fi
  578.  
  579.     echo
  580.     einfo "Gentoo's glibc no longer includes mdns."
  581.     einfo "If you want mdns, emerge the sys-auth/nss-mdns package."
  582.     echo
  583.  
  584.     if want_nptl && want_linuxthreads ; then
  585.         einfo "The default behavior of glibc on your system is to use NPTL.  If"
  586.         einfo "you want to use linuxthreads for a particular program, start it"
  587.         einfo "by executing 'LD_ASSUME_KERNEL=${LT_KERNEL_VERSION} <program> [<options>]'"
  588.         echo
  589.     fi
  590. }
  591.  
  592. ### SUPPORT FUNCTIONS ###
  593. # We need to be able to set alternative headers for
  594. # compiling for non-native platform
  595. # Will also become useful for testing kernel-headers without screwing up
  596. # the whole system.
  597. # note: intentionally undocumented.
  598. alt_headers() {
  599.     if [[ -z ${ALT_HEADERS} ]] ; then
  600.         if is_crosscompile ; then
  601.             ALT_HEADERS="/usr/${CTARGET}/include"
  602.         else
  603.             ALT_HEADERS="/usr/include"
  604.         fi
  605.     fi
  606.     echo "${ALT_HEADERS}"
  607. }
  608. alt_build_headers() {
  609.     if [[ -z ${ALT_BUILD_HEADERS} ]] ; then
  610.         ALT_BUILD_HEADERS=$(alt_headers)
  611.         tc-is-cross-compiler && ALT_BUILD_HEADERS=${ROOT}$(alt_headers)
  612.     fi
  613.     echo "${ALT_BUILD_HEADERS}"
  614. }
  615.  
  616. alt_prefix() {
  617.     if is_crosscompile ; then
  618.         echo /usr/${CTARGET}
  619.     else
  620.         echo /usr
  621.     fi
  622. }
  623.  
  624. alt_libdir() {
  625.     if is_crosscompile ; then
  626.         echo /usr/${CTARGET}/$(get_libdir)
  627.     else
  628.         echo /$(get_libdir)
  629.     fi
  630. }
  631.  
  632. alt_usrlibdir() {
  633.     if is_crosscompile ; then
  634.         echo /usr/${CTARGET}/$(get_libdir)
  635.     else
  636.         echo /usr/$(get_libdir)
  637.     fi
  638. }
  639.  
  640. setup_flags() {
  641.     # Make sure host make.conf doesn't pollute us
  642.     if is_crosscompile || tc-is-cross-compiler ; then
  643.         CHOST=${CTARGET} strip-unsupported-flags
  644.     fi
  645.  
  646.     # Store our CFLAGS because it's changed depending on which CTARGET
  647.     # we are building when pulling glibc on a multilib profile
  648.     CFLAGS_BASE=${CFLAGS_BASE-${CFLAGS}}
  649.     CFLAGS=${CFLAGS_BASE}
  650.     ASFLAGS_BASE=${ASFLAGS_BASE-${ASFLAGS}}
  651.     ASFLAGS=${ASFLAGS_BASE}
  652.  
  653.     # Over-zealous CFLAGS can often cause problems.  What may work for one
  654.     # person may not work for another.  To avoid a large influx of bugs
  655.     # relating to failed builds, we strip most CFLAGS out to ensure as few
  656.     # problems as possible.
  657.     strip-flags
  658.     strip-unsupported-flags
  659.     filter-flags -m32 -m64 -mabi=*
  660.  
  661.     unset CBUILD_OPT CTARGET_OPT
  662.     if has_multilib_profile ; then
  663.         CTARGET_OPT=$(get_abi_CTARGET)
  664.         [[ -z ${CTARGET_OPT} ]] && CTARGET_OPT=$(get_abi_CHOST)
  665.     fi
  666.  
  667.     case $(tc-arch) in
  668.         amd64)
  669.             # Punt this when amd64's 2004.3 is removed
  670.             CFLAGS_x86="-m32"
  671.         ;;
  672.         ppc)
  673.             append-flags "-freorder-blocks"
  674.         ;;
  675.         sparc)
  676.             # Both sparc and sparc64 can use -fcall-used-g6.  -g7 is bad, though.
  677.             filter-flags "-fcall-used-g7"
  678.             append-flags "-fcall-used-g6"
  679.             filter-flags "-mvis"
  680.  
  681.             if is_crosscompile || [[ ${PROFILE_ARCH} == "sparc64" ]] || { has_multilib_profile && ! tc-is-cross-compiler; } ; then
  682.                 case ${ABI} in
  683.                     sparc64)
  684.                         filter-flags -Wa,-xarch -Wa,-A
  685.  
  686.                         if is-flag "-mcpu=ultrasparc3"; then
  687.                             CTARGET_OPT="sparc64b-unknown-linux-gnu"
  688.                             append-flags "-Wa,-xarch=v9b"
  689.                             export ASFLAGS="${ASFLAGS} -Wa,-xarch=v9b"
  690.                         else
  691.                             CTARGET_OPT="sparc64-unknown-linux-gnu"
  692.                             append-flags "-Wa,-xarch=v9a"
  693.                             export ASFLAGS="${ASFLAGS} -Wa,-xarch=v9a"
  694.                         fi
  695.                     ;;
  696.                     *)
  697.                         if is-flag "-mcpu=ultrasparc3"; then
  698.                             CTARGET_OPT="sparcv9b-unknown-linux-gnu"
  699.                         else
  700.                             CTARGET_OPT="sparcv9-unknown-linux-gnu"
  701.                         fi
  702.                     ;;
  703.                 esac
  704.             else
  705.                 if is-flag "-mcpu=ultrasparc3"; then
  706.                     CTARGET_OPT="sparcv9b-unknown-linux-gnu"
  707.                 elif { is_crosscompile && want_nptl; } || is-flag "-mcpu=ultrasparc2" || is-flag "-mcpu=ultrasparc"; then
  708.                     CTARGET_OPT="sparcv9-unknown-linux-gnu"
  709.                 fi
  710.             fi
  711.         ;;
  712.     esac
  713.  
  714.     if [[ -n ${CTARGET_OPT} && ${CBUILD} == ${CHOST} ]] && ! is_crosscompile; then
  715.         CBUILD_OPT=${CTARGET_OPT}
  716.     fi
  717.  
  718.     if $(tc-getCC ${CTARGET}) -v 2>&1 | grep -q 'gcc version 3.[0123]'; then
  719.         append-flags -finline-limit=2000
  720.     fi
  721.  
  722.     # We dont want these flags for glibc
  723.     filter-ldflags -pie
  724.  
  725.     # We cannot build glibc with Bdirect support
  726.     filter-flags -Wl,-Bdirect
  727.     filter-ldflags -Bdirect
  728.     filter-ldflags -Wl,-Bdirect
  729.  
  730.     # Same for hashvals ...
  731.     filter-flags -Wl,-hashvals
  732.     filter-ldflags -hashvals
  733.     filter-ldflags -Wl,-hashvals
  734.  
  735.     # Lock glibc at -O2 -- linuxthreads needs it and we want to be
  736.     # conservative here
  737.     filter-flags -O?
  738.     append-flags -O2
  739. }
  740.  
  741. check_kheader_version() {
  742.     local header="$(alt_build_headers)/linux/version.h"
  743.  
  744.     [[ -z $1 ]] && return 1
  745.  
  746.     if [ -f "${header}" ] ; then
  747.         local version="`grep 'LINUX_VERSION_CODE' ${header} | \
  748.             sed -e 's:^.*LINUX_VERSION_CODE[[:space:]]*::'`"
  749.  
  750.         if [ "${version}" -ge "$1" ] ; then
  751.             return 0
  752.         fi
  753.     fi
  754.  
  755.     return 1
  756. }
  757.  
  758. check_nptl_support() {
  759.     local min_kernel_version="$(KV_to_int "${NPTL_KERNEL_VERSION}")"
  760.  
  761.     echo
  762.  
  763.     einfon "Checking gcc for __thread support ... "
  764.     if want__thread ; then
  765.         echo "yes"
  766.     else
  767.         echo "no"
  768.         echo
  769.         eerror "Could not find a gcc that supports the __thread directive!"
  770.         eerror "please update to gcc-3.2.2-r1 or later, and try again."
  771.         die "No __thread support in gcc!"
  772.     fi
  773.  
  774.     # Building fails on an non-supporting kernel
  775.     einfon "Checking kernel version (>=${NPTL_KERNEL_VERSION}) ... "
  776.     if [ "`get_KV`" -lt "${min_kernel_version}" ] ; then
  777.         echo "no"
  778.         echo
  779.         eerror "You need a kernel of at least version ${NPTL_KERNEL_VERSION}"
  780.         eerror "for NPTL support!"
  781.         die "Kernel version too low!"
  782.     else
  783.         echo "yes"
  784.     fi
  785.  
  786.     # Building fails with too low linux-headers
  787.     einfon "Checking linux-headers version (>=${NPTL_KERNEL_VERSION}) ... "
  788.     if ! check_kheader_version "${min_kernel_version}"; then
  789.         echo "no"
  790.         echo
  791.         eerror "You need linux-headers of at least version ${NPTL_KERNEL_VERSION}"
  792.         eerror "for NPTL support!"
  793.         die "linux-headers version too low!"
  794.     else
  795.         echo "yes"
  796.     fi
  797.  
  798.     echo
  799. }
  800.  
  801. want_nptl() {
  802.     want_tls || return 1
  803.     use nptl || return 1
  804.  
  805.     # Archs that can use NPTL
  806.     case $(tc-arch) in
  807.         alpha|amd64|ia64|mips|ppc|ppc64|s390|sh|x86)
  808.             return 0;
  809.         ;;
  810.         sparc)
  811.             # >= v9 is needed for nptl.
  812.             [[ "${PROFILE_ARCH}" == "sparc" ]] && return 1
  813.             return 0;
  814.         ;;
  815.     esac
  816.  
  817.     return 1
  818. }
  819.  
  820. want_linuxthreads() {
  821.     ! use nptlonly && return 0
  822.     want_nptl || return 0
  823.     return 1
  824. }
  825.  
  826. want_tls() {
  827.     # Archs that can use TLS (Thread Local Storage)
  828.     case $(tc-arch) in
  829.         alpha|amd64|ia64|mips|ppc|ppc64|s390|sh)
  830.             return 0;
  831.         ;;
  832.         sparc)
  833.             # 2.3.6 should have tls support on sparc64
  834.             # when using newer binutils
  835.             case ${CTARGET/-*} in
  836.                 sparc64*) return 1 ;;
  837.                 *) return 0 ;;
  838.             esac
  839.         ;;
  840.         x86)
  841.             # requires i486 or better #106556
  842.             [[ ${CTARGET} == i[4567]86* ]] && return 0
  843.         ;;
  844.     esac
  845.  
  846.     return 1
  847. }
  848.  
  849. want__thread() {
  850.     want_tls || return 1
  851.  
  852.     # For some reason --with-tls --with__thread is causing segfaults on sparc32.
  853.     [[ ${PROFILE_ARCH} == "sparc" ]] && return 1
  854.  
  855.     [[ -n ${WANT__THREAD} ]] && return ${WANT__THREAD}
  856.  
  857.     $(tc-getCC ${CTARGET}) -c ${FILESDIR}/test-__thread.c -o ${T}/test2.o &> /dev/null
  858.     WANT__THREAD=$?
  859.  
  860.     return ${WANT__THREAD}
  861. }
  862.  
  863. install_locales() {
  864.     unset LANGUAGE LANG LC_ALL
  865.     cd "${WORKDIR}"/${MYMAINBUILDDIR} || die "${WORKDIR}/${MYMAINBUILDDIR}"
  866.     make PARALLELMFLAGS="${MAKEOPTS} -j1" \
  867.         install_root=${D} localedata/install-locales || die
  868. }
  869.  
  870. setup_locales() {
  871.     if use !userlocales ; then
  872.         einfo "userlocales not enabled, installing -ALL- locales..."
  873.         install_locales || die
  874.     elif [ -e /etc/locales.build ] ; then
  875.         einfo "Installing locales in /etc/locales.build..."
  876.         echo 'SUPPORTED-LOCALES=\' > SUPPORTED.locales
  877.         cat /etc/locales.build | grep -v -e ^$ -e ^\# | sed 's/$/\ \\/g' \
  878.             >> SUPPORTED.locales
  879.         cat SUPPORTED.locales > ${S}/localedata/SUPPORTED || die
  880.         install_locales || die
  881.     elif [ -e ${FILESDIR}/locales.build ] ; then
  882.         einfo "Installing locales in ${FILESDIR}/locales.build..."
  883.         echo 'SUPPORTED-LOCALES=\' > SUPPORTED.locales
  884.         cat ${FILESDIR}/locales.build | grep -v -e ^$ -e ^\# | sed 's/$/\ \\/g' \
  885.             >> SUPPORTED.locales
  886.         cat SUPPORTED.locales > ${S}/localedata/SUPPORTED || die
  887.         install_locales || die
  888.     else
  889.         einfo "Installing -ALL- locales..."
  890.         install_locales || die
  891.     fi
  892. }
  893.  
  894. glibc_do_configure() {
  895.     local myconf
  896.  
  897.     # set addons
  898.     pushd ${S} > /dev/null
  899.     ADDONS=$(echo */configure | sed -e 's!/configure!!g;s!\(linuxthreads\|nptl\|rtkaio\|glibc-compat\)\( \|$\)!!g;s! \+$!!;s! !,!g;s!^!,!;/^,\*$/d')
  900.     use glibc-compat20 && [[ -d glibc-compat ]] && ADDONS="${ADDONS},glibc-compat"
  901.     popd > /dev/null
  902.  
  903.     use nls || myconf="${myconf} --disable-nls"
  904.     use erandom || myconf="${myconf} --disable-dev-erandom"
  905.  
  906.     use glibc-omitfp && myconf="${myconf} --enable-omitfp"
  907.  
  908.     [[ ${CTARGET} == *-softfloat-* ]] && myconf="${myconf} --without-fp"
  909.  
  910.     if [ "$1" == "linuxthreads" ] ; then
  911.         if want_tls && [[ ${CTARGET} != i[45]86-* ]] ; then
  912.             myconf="${myconf} --with-tls"
  913.  
  914.             if want__thread && use linuxthreads-tls ; then
  915.                 myconf="${myconf} --with-__thread"
  916.             else
  917.                 myconf="${myconf} --without-__thread"
  918.             fi
  919.         else
  920.             myconf="${myconf} --without-tls --without-__thread"
  921.         fi
  922.  
  923.         myconf="${myconf} --enable-add-ons=linuxthreads${ADDONS}"
  924.         myconf="${myconf} --enable-kernel=${LT_KERNEL_VERSION}"
  925.     elif [ "$1" == "nptl" ] ; then
  926.         myconf="${myconf} --with-tls --with-__thread"
  927.         myconf="${myconf} --enable-add-ons=nptl${ADDONS}"
  928.         myconf="${myconf} --enable-kernel=${NPTL_KERNEL_VERSION}"
  929.     else
  930.         die "invalid pthread option"
  931.     fi
  932.  
  933.     # Since SELinux support is only required for nscd, only enable it if:
  934.     # 1. USE selinux
  935.     # 2. ! USE build
  936.     # 3. only for the primary ABI on multilib systems
  937.     if use selinux && ! use build; then
  938.         if use multilib || has_multilib_profile; then
  939.             if is_final_abi; then
  940.                 myconf="${myconf} --with-selinux"
  941.             else
  942.                 myconf="${myconf} --without-selinux"
  943.             fi
  944.         else
  945.             myconf="${myconf} --with-selinux"
  946.         fi
  947.     else
  948.         myconf="${myconf} --without-selinux"
  949.     fi
  950.  
  951.     # Pick out the correct location for build headers
  952.     myconf="${myconf}
  953.         --without-cvs
  954.         --enable-bind-now
  955.         --build=${CBUILD_OPT:-${CBUILD}}
  956.         --host=${CTARGET_OPT:-${CTARGET}}
  957.         $(use_enable profile)
  958.         --without-gd
  959.         --with-headers=$(alt_build_headers)
  960.         --prefix=$(alt_prefix)
  961.         --mandir=$(alt_prefix)/share/man
  962.         --infodir=$(alt_prefix)/share/info
  963.         --libexecdir=$(alt_prefix)/lib/misc/glibc
  964.         ${EXTRA_ECONF}"
  965.  
  966.     has_version app-admin/eselect-compiler || export CC="$(tc-getCC ${CTARGET})"
  967.  
  968.     GBUILDDIR=${WORKDIR}/build-${ABI}-${CTARGET}-$1
  969.     mkdir -p ${GBUILDDIR}
  970.     cd ${GBUILDDIR}
  971.     einfo "Configuring GLIBC for $1 with: ${myconf// /\n\t\t}"
  972.     ${S}/configure ${myconf} || die "failed to configure glibc"
  973. }
  974.  
  975. fix_lib64_symlinks() {
  976.     # the original Gentoo/AMD64 devs decided that since 64bit is the native
  977.     # bitdepth for AMD64, lib should be used for 64bit libraries. however,
  978.     # this ignores the FHS and breaks multilib horribly... especially
  979.     # since it wont even work without a lib64 symlink anyways. *rolls eyes*
  980.     # see bug 59710 for more information.
  981.     # Travis Tilley <lv@gentoo.org> (08 Aug 2004)
  982.     if [ -L ${ROOT}/lib64 ] ; then
  983.         ewarn "removing /lib64 symlink and moving lib to lib64..."
  984.         ewarn "dont hit ctrl-c until this is done"
  985.         addwrite ${ROOT}/
  986.         rm ${ROOT}/lib64
  987.         # now that lib64 is gone, nothing will run without calling ld.so
  988.         # directly. luckily the window of brokenness is almost non-existant
  989.         use amd64 && /lib/ld-linux-x86-64.so.2 /bin/mv ${ROOT}/lib ${ROOT}/lib64
  990.         use ppc64 && /lib/ld64.so.1 /bin/mv ${ROOT}/lib ${ROOT}/lib64
  991.         # all better :)
  992.         ldconfig
  993.         ln -s lib64 ${ROOT}/lib
  994.         einfo "done! :-)"
  995.         einfo "fixed broken lib64/lib symlink in ${ROOT}"
  996.     fi
  997.     if [ -L ${ROOT}/usr/lib64 ] ; then
  998.         addwrite ${ROOT}/usr
  999.         rm ${ROOT}/usr/lib64
  1000.         mv ${ROOT}/usr/lib ${ROOT}/usr/lib64
  1001.         ln -s lib64 ${ROOT}/usr/lib
  1002.         einfo "fixed broken lib64/lib symlink in ${ROOT}/usr"
  1003.     fi
  1004.     if [ -L ${ROOT}/usr/X11R6/lib64 ] ; then
  1005.         addwrite ${ROOT}/usr/X11R6
  1006.         rm ${ROOT}/usr/X11R6/lib64
  1007.         mv ${ROOT}/usr/X11R6/lib ${ROOT}/usr/X11R6/lib64
  1008.         ln -s lib64 ${ROOT}/usr/X11R6/lib
  1009.         einfo "fixed broken lib64/lib symlink in ${ROOT}/usr/X11R6"
  1010.     fi
  1011. }
  1012.  
  1013. use_multilib() {
  1014.     case ${CTARGET} in
  1015.         sparc64*|mips64*|x86_64*|powerpc64*|s390x*)
  1016.             has_multilib_profile || use multilib ;;
  1017.         *)  false ;;
  1018.     esac
  1019. }
  1020.  
  1021. # Setup toolchain variables that would be defined in the profiles for these archs.
  1022. setup_env() {
  1023.     # These should not be set, else the zoneinfo do not always get installed ...
  1024.     unset LANGUAGE LANG LC_ALL
  1025.     # silly users
  1026.     unset LD_RUN_PATH
  1027.  
  1028.     if is_crosscompile || tc-is-cross-compiler ; then
  1029.         multilib_env ${CTARGET}
  1030.         if ! use multilib ; then
  1031.             MULTILIB_ABIS=${DEFAULT_ABI}
  1032.         else
  1033.             MULTILIB_ABIS=${MULTILIB_ABIS:-${DEFAULT_ABI}}
  1034.         fi
  1035.  
  1036.         # If the user has CFLAGS_<CTARGET> in their make.conf, use that,
  1037.         # and fall back on CFLAGS.
  1038.         local VAR=CFLAGS_${CTARGET//[-.]/_}
  1039.         CFLAGS=${!VAR-${CFLAGS}}
  1040.     fi
  1041.  
  1042.     setup_flags
  1043.  
  1044.     export ABI=${ABI:-${DEFAULT_ABI:-default}}
  1045.  
  1046.     if is_crosscompile || tc-is-cross-compiler ; then
  1047.         local VAR=CFLAGS_${ABI}
  1048.         # We need to export CFLAGS with abi information in them because
  1049.         # glibc's configure script checks CFLAGS for some targets (like mips)
  1050.         export CFLAGS="${!VAR} ${CFLAGS}"
  1051.     fi
  1052. }
  1053.  
  1054. ### /ECLASS PUNTAGE ###
  1055.  
  1056. if is_crosscompile ; then
  1057.     SLOT="${CTARGET}-2.2"
  1058. else
  1059.     SLOT="2.2"
  1060. fi
  1061.  
  1062. # we'll handle stripping ourself #46186
  1063. RESTRICT="nostrip multilib-pkg-force"
  1064.  
  1065. # We need a new-enough binutils for as-needed
  1066. DEPEND=">=sys-devel/gcc-3.3.3
  1067.     nptl? ( >=sys-kernel/linux-headers-${NPTL_KERNEL_VERSION} )
  1068.     >=sys-devel/binutils-2.15.94
  1069.     >=sys-devel/gcc-config-1.3.12
  1070.     virtual/os-headers
  1071.     nls? ( sys-devel/gettext )
  1072.     selinux? ( !build? ( sys-libs/libselinux ) )"
  1073. RDEPEND="nls? ( sys-devel/gettext )
  1074.     selinux? ( !build? ( sys-libs/libselinux ) )"
  1075.  
  1076. if [[ ${CATEGORY/cross-} != ${CATEGORY} ]] ; then
  1077.     DEPEND="${DEPEND} ${CATEGORY}/gcc"
  1078.  
  1079.     if [[ ${CATEGORY} == *-linux* ]] ; then
  1080.         if [[ ${CATEGORY} == cross-mips* ]] ; then
  1081.             DEPEND="${DEPEND} >=${CATEGORY}/mips-headers-2.6.10"
  1082.         else
  1083.             DEPEND="${DEPEND} ${CATEGORY}/linux-headers"
  1084.         fi
  1085.     fi
  1086. else
  1087.     DEPEND="${DEPEND} sys-libs/timezone-data"
  1088.     RDEPEND="${RDEPEND} sys-libs/timezone-data"
  1089. fi
  1090.  
  1091. pkg_setup() {
  1092.     if portageq has_version / '>=sys-libs/glibc-2.3.5.20050201' && \
  1093.        portageq    has_version / '<sys-libs/glibc-2.3.6' ; then
  1094.         eerror "Portage have a serious bug in regards to symlinks, and merging"
  1095.         eerror "this with current versions will fail!  See:"
  1096.         echo
  1097.         eerror "  http://bugs.gentoo.org/show_bug.cgi?id=112082"
  1098.         echo
  1099.         eerror "If you want to update, please apply this patch:"
  1100.         echo
  1101.         eerror "  http://bugs.gentoo.org/attachment.cgi?id=72643"
  1102.         echo
  1103.         eerror "to '/usr/$(get_libdir)/portage/portage.py' and"
  1104.         eerror "comment the die() below."
  1105.         echo
  1106.         ebeep
  1107.         die "Might break upgrading."
  1108.     fi
  1109.  
  1110.     if use nptlonly && ! use nptl ; then
  1111.         eerror "If you want nptlonly, add nptl to your USE too ;p"
  1112.         die "nptlonly without nptl"
  1113.     fi
  1114.  
  1115.     # give some sort of warning about the nptl logic changes...
  1116.     if want_nptl && want_linuxthreads ; then
  1117.  
  1118.         ewarn "Warning! Gentoo's GLIBC with NPTL enabled now behaves like the"
  1119.         ewarn "glibc from almost every other distribution out there. This means"
  1120.         ewarn "that glibc is compiled -twice-, once with linuxthreads and once"
  1121.         ewarn "with nptl. The NPTL version is installed to lib/tls and is still"
  1122.         ewarn "used by default. If you do not need nor want the linuxthreads"
  1123.         ewarn "fallback, you can disable this behavior by adding nptlonly to"
  1124.         ewarn "USE to save yourself some compile time."
  1125.  
  1126.         ebeep
  1127.         epause 5
  1128.     fi
  1129. }
  1130.  
  1131. src_unpack() {
  1132.     setup_env
  1133.  
  1134.     case $(tc-arch) in
  1135.         hppa)
  1136.             GLIBC_PATCH_EXCLUDE="${GLIBC_PATCH_EXCLUDE} 2000-all-2.3.2-propolice-guard-functions-v3.patch"
  1137.             use hardened || GLIBC_PATCH_EXCLUDE="${GLIBC_PATCH_EXCLUDE} 6490_hppa_hardened-disable__init_arrays.patch"
  1138.         ;;
  1139.         mips)
  1140.             GLIBC_PATCH_EXCLUDE="${GLIBC_PATCH_EXCLUDE} 3000-all-2.3.4-dl_execstack-PaX-support.patch 6640_mips_unistd_h-fixes.patch"
  1141.             use_multilib \
  1142.                 && GLIBC_PATCH_EXCLUDE="${GLIBC_PATCH_EXCLUDE} 6680_mips_nolib3264.patch" \
  1143.                 || GLIBC_PATCH_EXCLUDE="${GLIBC_PATCH_EXCLUDE} 5005_all_enable-multilib-with-cross-compile.patch"
  1144.         ;;
  1145.         amd64)
  1146.             if ! has_multilib_profile && ! is_crosscompile ; then
  1147.                 # the gentoo-libdir patch hack conflicts with these
  1148.                 GLIBC_PATCH_EXCLUDE="${GLIBC_PATCH_EXCLUDE} 5005_all_enable-multilib-with-cross-compile.patch"
  1149.             fi
  1150.         ;;
  1151.     esac
  1152.  
  1153.     # Do not enable -Bdirect support for now.
  1154.     GLIBC_PATCH_EXCLUDE="${GLIBC_PATCH_EXCLUDE} 2020_all_2.3.6-hashvals.patch"
  1155.     GLIBC_PATCH_EXCLUDE="${GLIBC_PATCH_EXCLUDE} 2030_all_2.3.6-bdirect.patch"
  1156.  
  1157.     toolchain-glibc_src_unpack
  1158.  
  1159.     # XXX: do not package ssp up into tarballs, leave it in FILESDIR
  1160.     cd "${S}"
  1161.     cp "${FILESDIR}"/2.3.5/ssp.c sysdeps/unix/sysv/linux/ || die "could not find ssp.c"
  1162.     rm -f "${WORKDIR}"/patches/2*
  1163.     epatch "${FILESDIR}"/2.3.6/glibc-2.3.6-propolice-guard-functions.patch
  1164.     epatch "${FILESDIR}"/2.3.5/glibc-2.3.5-frandom-detect.patch
  1165.  
  1166.     case $(tc-arch) in
  1167.         alpha)
  1168.             # Is this still needed?
  1169.             rm -f sysdeps/alpha/alphaev6/memcpy.S
  1170.         ;;
  1171.         amd64)
  1172.             if ! has_multilib_profile && ! is_crosscompile; then
  1173.                 # CONF_LIBDIR support
  1174.                 epatch ${FILESDIR}/2.3.4/glibc-gentoo-libdir.patch
  1175.                 sed -i -e "s:@GENTOO_LIBDIR@:$(get_libdir):g" ${S}/sysdeps/unix/sysv/linux/configure
  1176.             fi
  1177.         ;;
  1178.         ppc64)
  1179.             # setup lib -- seems like a good place to set this up
  1180.             has_multilib_profile || get_libdir_override lib64
  1181.         ;;
  1182.     esac
  1183.  
  1184.     # Glibc is stupid sometimes, and doesn't realize that with a
  1185.     # static C-Only gcc, -lgcc_eh doesn't exist.
  1186.     # http://sources.redhat.com/ml/libc-alpha/2003-09/msg00100.html
  1187.     # http://sourceware.org/ml/libc-alpha/2005-02/msg00042.html
  1188.     echo 'int main(){}' > ${T}/gcc_eh_test.c
  1189.     if ! $(tc-getCC ${CTARGET}) ${T}/gcc_eh_test.c -lgcc_eh 2>/dev/null ; then
  1190.         sed -i -e 's:-lgcc_eh::' Makeconfig || die "sed gcc_eh"
  1191.     fi
  1192.  
  1193.     # Some configure checks fail on the first emerge through because they
  1194.     # try to link.  This doesn't work well if we don't have a libc yet.
  1195.     # http://sourceware.org/ml/libc-alpha/2005-02/msg00042.html
  1196.     if is_crosscompile && use build; then
  1197.         rm ${S}/sysdeps/sparc/sparc64/elf/configure{,.in}
  1198.         rm ${S}/nptl/sysdeps/pthread/configure{,.in}
  1199.     fi
  1200.  
  1201.     cd "${WORKDIR}"
  1202.     find . -type f '(' -size 0 -o -name "*.orig" ')' -exec rm -f {} \;
  1203.     find . -name configure -exec touch {} \;
  1204.  
  1205.     # Fix permissions on some of the scripts
  1206.     chmod u+x "${S}"/scripts/*.sh
  1207. }
  1208.  
  1209. src_compile() {
  1210.     setup_env
  1211.  
  1212.     if [[ -z ${OABI} ]] ; then
  1213.         local abilist=""
  1214.         if has_multilib_profile ; then
  1215.             abilist=$(get_install_abis)
  1216.             einfo "Building multilib glibc for ABIs: ${abilist}"
  1217.         elif is_crosscompile || tc-is-cross-compiler ; then
  1218.             abilist=${DEFAULT_ABI}
  1219.         fi
  1220.         if [[ -n ${abilist} ]] ; then
  1221.             OABI=${ABI}
  1222.             for ABI in ${abilist} ; do
  1223.                 export ABI
  1224.                 src_compile
  1225.             done
  1226.             ABI=${OABI}
  1227.             unset OABI
  1228.             return 0
  1229.         fi
  1230.     fi
  1231.  
  1232.     if just_headers ; then
  1233.         toolchain-glibc_headers_compile
  1234.     else
  1235.         toolchain-glibc_src_compile
  1236.     fi
  1237. }
  1238.  
  1239. src_test() {
  1240.     setup_env
  1241.  
  1242.     if [[ -z ${OABI} ]] && has_multilib_profile ; then
  1243.         OABI=${ABI}
  1244.         einfo "Testing multilib glibc for ABIs: $(get_install_abis)"
  1245.         for ABI in $(get_install_abis) ; do
  1246.             export ABI
  1247.             einfo "   Testing ${ABI} glibc"
  1248.             src_test
  1249.         done
  1250.         ABI=${OABI}
  1251.         unset OABI
  1252.         return 0
  1253.     fi
  1254.  
  1255.     toolchain-glibc_src_test
  1256. }
  1257.  
  1258. src_strip() {
  1259.     # Now, strip everything but the thread libs #46186, as well as the dynamic
  1260.     # linker, else we cannot set breakpoints in shared libraries due to bugs in
  1261.     # gdb.  Also want to grab stuff in tls subdir.  whee.
  1262. #when new portage supports this ...
  1263. #    env \
  1264. #        -uRESTRICT \
  1265. #        CHOST=${CTARGET} \
  1266. #        STRIP_MASK="/*/{,tls/}{ld-,lib{pthread,thread_db}}*" \
  1267. #        prepallstrip
  1268.     pushd "${D}" > /dev/null
  1269.  
  1270.     if ! is_crosscompile ; then
  1271.         mkdir -p "${T}"/strip-backup
  1272.         for x in $(find "${D}" -maxdepth 3 \
  1273.                    '(' -name 'ld-*' -o -name 'libpthread*' -o -name 'libthread_db*' ')' \
  1274.                    -a '(' '!' -name '*.a' ')' -type f -printf '%P ')
  1275.         do
  1276.             mkdir -p "${T}/strip-backup/${x%/*}"
  1277.             cp -a -- "${D}/${x}" "${T}/strip-backup/${x}" || die "backing up ${x}"
  1278.         done
  1279.     fi
  1280.     env -uRESTRICT CHOST=${CTARGET} prepallstrip
  1281.     if ! is_crosscompile ; then
  1282.         cp -a -- "${T}"/strip-backup/* "${D}"/ || die "restoring non-stripped libs"
  1283.     fi
  1284.  
  1285.     popd > /dev/null
  1286. }
  1287.  
  1288. src_install() {
  1289.     setup_env
  1290.  
  1291.     if [[ -z ${OABI} ]] ; then
  1292.         local abilist=""
  1293.         if has_multilib_profile ; then
  1294.             abilist=$(get_install_abis)
  1295.             einfo "Installing multilib glibc for ABIs: ${abilist}"
  1296.         elif is_crosscompile || tc-is-cross-compiler ; then
  1297.             abilist=${DEFAULT_ABI}
  1298.         fi
  1299.         if [[ -n ${abilist} ]] ; then
  1300.             OABI=${ABI}
  1301.             for ABI in ${abilist} ; do
  1302.                 export ABI
  1303.                 src_install
  1304.             done
  1305.             ABI=${OABI}
  1306.             unset OABI
  1307.             src_strip
  1308.             return 0
  1309.         fi
  1310.     fi
  1311.  
  1312.     # Handle stupid lib32 BS
  1313.     unset OLD_LIBDIR
  1314.     if ! is_crosscompile ; then
  1315.         if [[ $(tc-arch) == "amd64" && ${ABI} == "x86" && $(get_libdir) != "lib" ]] ; then
  1316.             OLD_LIBDIR=$(get_libdir)
  1317.             LIBDIR_x86="lib"
  1318.         fi
  1319.  
  1320.         if [[ $(tc-arch) == "ppc64" && ${ABI} == "ppc" && $(get_libdir) != "lib" ]] ; then
  1321.             OLD_LIBDIR=$(get_libdir)
  1322.             LIBDIR_ppc="lib"
  1323.         fi
  1324.     fi
  1325.  
  1326.     if just_headers ; then
  1327.         toolchain-glibc_headers_install
  1328.     else
  1329.         toolchain-glibc_src_install
  1330.     fi
  1331.     [[ -z ${OABI} ]] && src_strip
  1332.  
  1333.     # Handle stupid lib32 BS on amd64 and ppc64
  1334.     if [[ -n ${OLD_LIBDIR} ]] ; then
  1335.         cd "${S}"
  1336.         [[ $(tc-arch) == "amd64" ]] && LIBDIR_x86=${OLD_LIBDIR}
  1337.         [[ $(tc-arch) == "ppc64" ]] && LIBDIR_ppc=${OLD_LIBDIR}
  1338.         unset OLD_LIBDIR
  1339.  
  1340.         mv "${D}"/lib "${D}"/$(get_libdir)
  1341.         mv "${D}"/usr/lib "${D}"/usr/$(get_libdir)
  1342.         dodir /lib
  1343.         dodir /usr/lib
  1344.         mv "${D}"/usr/$(get_libdir)/locale "${D}"/usr/lib
  1345.         [[ $(tc-arch) == "amd64" ]] && dosym ../$(get_libdir)/ld-linux.so.2 /lib/ld-linux.so.2
  1346.         [[ $(tc-arch) == "ppc64" ]] && dosym ../$(get_libdir)/ld.so.1 /lib/ld.so.1
  1347.  
  1348.         for f in "${D}"/usr/$(get_libdir)/*.so; do
  1349.             local basef=$(basename "${f}")
  1350.             if [[ -L ${f} ]] ; then
  1351.                 local target=$(readlink "${f}")
  1352.                 target=${target/\/lib\//\/$(get_libdir)\/}
  1353.                 rm "${f}"
  1354.                 dosym "${target}" /usr/$(get_libdir)/"${basef}"
  1355.             fi
  1356.         done
  1357.  
  1358.         dosed "s:/lib/:/$(get_libdir)/:g" /usr/$(get_libdir)/lib{c,pthread}.so
  1359.  
  1360.         if want_nptl && want_linuxthreads ; then
  1361.             dosed  "s:/lib/:/$(get_libdir)/:g" /usr/$(get_libdir)/nptl/lib{c,pthread}.so
  1362.         fi
  1363.     fi
  1364.  
  1365.     # PPC NPTL fix
  1366.     if [[ $(tc-arch) == "ppc" ]] && use nptl && ! use nptlonly ; then
  1367.         cp ${WORKDIR}/build-default-${CTARGET}-nptl/elf/ld.so ${D}/lib/ld-${PV}.so
  1368.     fi
  1369. }
  1370.  
  1371. pkg_preinst() {
  1372.     toolchain-glibc_pkg_preinst
  1373. }
  1374.  
  1375. pkg_postinst() {
  1376.     toolchain-glibc_pkg_postinst
  1377. }
  1378.